/**
 * 判断是否有路由的权限
 * @param authority 路由权限配置
 * @param permissions 用户权限集合
 * @returns {boolean|*}
 */
function hasPermission(authority, permissions) {
    let required = '*'
    if (typeof authority === 'string') {
        required = authority
    } else if (typeof authority === 'object') {
        required = authority.permission
    }
    return required === '*' || (permissions && permissions.findIndex(item => item === required || item.id === required) !== -1)
}

/**
 * 判断是否有路由需要的角色
 * @param authority 路由权限配置
 * @param roles 用户角色集合
 */
function hasRole(route, authority, roles) {

    if (Array.isArray(roles)) {
        return authority.role === roles[0];

    } else {
        return authority.role === roles;
    }


    // // 默认没有需要的角色
    // let required = undefined
    // if (typeof authority === 'object') {
    //     // 获取到路由需要的角色
    //     required = authority.role
    // }
    //
    //
    //
    // // 是否是任何角色都能访问的路由 || 当前用户有需要的角色
    // return authority === '*' || hasAnyRole(required, roles)
}

/**
 * 判断是否有需要的任意一个角色
 * @param required {String | Array[String]} 需要的角色，可以是单个角色或者一个角色数组
 * @param role 拥有的角色
 * @returns {boolean}
 */
// eslint-disable-next-line no-unused-vars
function hasAnyRole(required, role) {
    console.log('required  ===> ' + required);
    console.log('roles  ===> ' + roles);

    let roles = [];
    if (Array.isArray(role)) {
        roles = role;
    } else {
        roles.push(role);
    }

    if (!required) {
        // 当前路由不需要任何角色，可以显示
        return false
    } else if (Array.isArray(required)) {
        // 只要有一个角色名相等就可以显示
        return roles.findIndex(role => {
            return required.findIndex(item => item === role || item === role.id) !== -1
        }) !== -1
    } else {
        return roles.findIndex(role => role === required || role.id === required) !== -1
    }
}

/**
 * 路由权限校验
 * @param route 路由
 * @param permissions 用户权限集合
 * @param roles 用户角色集合
 * @returns {boolean}
 */
function hasAuthority(route, permissions, roles) {
    console.log(route.meta.pAuthorities);
    console.log(route.meta.authority);
    console.log("permissions    " + permissions);
    console.log("roles  " + roles);
    console.log("authority  " + authority);
    // const authorities = [...route.meta.pAuthorities, route.meta.authority]
    let authority = route.meta.authority
    if (!hasPermission(authority, permissions) && !hasRole(route,authority, roles)) {
            return false
        }

    return true
}

/**
 * 根据权限配置过滤菜单数据
 * @param menuData
 * @param permissions
 * @param roles
 */
function filterMenu(menuData, permissions, roles) {
    return menuData.filter(menu => {
        if (menu.meta && menu.meta.invisible === undefined) {
            if (!hasAuthority(menu, permissions, roles)) {
                // 当前节点不显示了，他的子节点也不显示了，直接返回
                return false
            }
        }
        if (menu.children && menu.children.length > 0) {
            // 递归过滤子层级
            menu.children = filterMenu(menu.children, permissions, roles)
        }
        return true
    })
}

export {filterMenu, hasAuthority}
